package cn.ronghuanet.org.controller;

import cn.ronghuanet.annotation.RonghuaPermission;
import cn.ronghuanet.org.domain.Department;
import cn.ronghuanet.org.query.DepartmentQuery;
import cn.ronghuanet.org.service.IDepartmentService;
import cn.ronghuanet.basic.utils.AjaxResult;
import cn.ronghuanet.basic.utils.PageList;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.util.*;

/**
 * 权限项目是一个前后端分离的项目,后端是不需要响应页面给前端的,而是直接给前端响应数据,因此controller直接使用@RestController
 *   @RestController @Controller+@ResponseBody 它里面所有的方法默认都是不通过视图解析器,而是直接返回json字符串
 *
 *   注意:在controller中,同一个controller里面,两个方法的请求方式和url不能一模一样
 *
 *   首先要自定义一个权限注解
 *   在要使用权限才能访问的类和方法上面加自定义注解
 *   在项目启动时,来扫描controller这个包下面所有的Controller类 - ServletContextListener-在tomcat容器启动之后立刻做某个事情
 *      判断Controller类上是否有自定义注解,
 *          如果没有自定义注解就说明当前这个类不需要权限就能访问,就直接跳过,不需要再去处理方法了
 *          如果有自定义注解,就说明这个类里面的方法需要权限才能访问
 *              获取这个类里面所有的方法(反射),循环这些方法,判断方法上面有没有自定义注解(反射)
 *                  如果没有,就不处理
 *                  如果有注解,就封装Permission对象,并存到数据库的t_permission表中
 */
@RestController
@RequestMapping("/department")
@Api(value = "部门接口",description = "部门接口的增删改查")
@RonghuaPermission(name = "部门管理",descs = "对于部门的一些操作")
public class DepartmentController {

    @Autowired
    private IDepartmentService departmentService;

    /**
     * 新增/修改
     * 在使用post put等请求,在接收一个对象作为参数时,必须要加@RequestBody
     *   @RequestBody 要从请求体中获取数据
     * @param department
     * @return
     */
    @RonghuaPermission(name = "新增修改部门")
    @PutMapping
    @ApiOperation("新增/修改部门")
    //@Permission(name="新增修改部门",descs="部门的新增修改操作")   //url:/department-拼接类和方法上的@RequestMapping的值 sn DepartmentController:addOrUpdate
    public AjaxResult addOrUpdate(@RequestBody Department department){
        try {
            // 判断ID有没有值
            if(Objects.isNull(department.getId())){
                // 新增
                departmentService.add(department);
            }else{
                // 修改
                departmentService.update(department);
            }
            return AjaxResult.me();
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMessage("保存失败!"+e.getMessage());
        }
    }

    /**
     * 删除
     * restful风格,DELETE请求方式就说明要做删除操作
     * 写法一:  @RequestMapping(value = "/{id}",method = RequestMethod.DELETE)
     * 写法二:@DeleteMapping("/{id}")  除了@DeleteMapping以外,还有PostMapping  GetMapping PutMapping
     * 前后端分离开发,后端提供接口时,要告知前端操作是否成功
     *  如果是增删改操作,如果操作成功,那么前端就直接展示操作成功就可以了,但是如果是失败,还要显示错误原因
     * 要返回什么?返回信息应该包含:是否操作成功,提示信息
     * 怎么返回?
     *      1 拼json格式的字符串   "{\"success\":true,\"message\":\"删除成功\"}"  不建议用  拼字符串很麻烦而且很容易出问题
     *      2 返回Map  就是将结果放在map中返回,框架会将Map转为一个json格式的字符串
     *      3 返回一个自定义对象 AjaxResult
     *          框架会将AjaxResult这个对象转成一个json格式的字符串
     *          并且自定义对象中采用了链式编程的方法
     */
    @RonghuaPermission(name = "根据ID删除部门")
    @DeleteMapping("/{id}")
    @ApiOperation("删除")
    public AjaxResult deleteById(@ApiParam("主键") @PathVariable("id")Long id){
        /*
        方案二
        Map<String,Object> map = new HashMap<>();
        try {
            departmentService.deleteById(id);
            // 如果没有报错,就说明操作成功,如果报错,就是失败
            map.put("success", true);
            map.put("message", "删除成功!");
        } catch (Exception e) {
            e.printStackTrace();
            map.put("success", false);
            map.put("message", "删除失败!");
        }
        return map;*/
        // 方案三
        try {
            departmentService.deleteById(id);
            // return new AjaxResult(true,"");
            return AjaxResult.me();
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMessage("删除失败!"+e.getMessage());
        }
    }

    /**
     * 批量删除的传参
     * 方式一:用字符串接收:id1,id2,id3  中间用,隔开  这样的话,后端拿到以后,要通过,分隔开转成一个数组或List
     * 方式二:用数组或List接收
     * @return
     */
    @RonghuaPermission(name = "批量删除")
    @PatchMapping
    @ApiOperation("批量删除")
    public AjaxResult batchDelete(@RequestBody List<Long> ids){
        try {
            // 将字符串的ID值转成List数组
            departmentService.batchDelete(ids);
            return AjaxResult.me();
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMessage("批量删除失败!"+e.getMessage());
        }
    }

    /**
     * 查询,根据ID查询
     * 在前后端分离开发模式中,查询接口也要告知前端 操作是成功还是失败
     * 如果成功,返回success=true以外,还要将查询出的数据返给前端
     * @param id
     */
    @RonghuaPermission(name = "根据ID查询")
    @GetMapping("/{id}")
    @ApiOperation("根据ID查询")
    public AjaxResult getById(@PathVariable("id")Long id){
        try {
            Department department = departmentService.getById(id);
            return AjaxResult.me().setDataObj(department);
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMessage("查询失败!"+e.getMessage());
        }
    }

    // 查询所有
    @RonghuaPermission(name = "查询所有")
    @GetMapping
    @ApiOperation("查询所有")
    public AjaxResult getAll(){
        try {
            List<Department> departments = departmentService.getAll();
            return AjaxResult.me().setDataObj(departments);
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMessage("查询失败!"+e.getMessage());
        }
    }

    /**
     * 分页
     * @param query
     * @return
     */
    @RonghuaPermission(name = "分页高级查询")
    @PostMapping
    public AjaxResult listPage(@RequestBody DepartmentQuery query, HttpSession session){
        try {
            System.out.println("sessionId=========================r"+session.getId());
            PageList<Department> result = departmentService.listPage(query);
            return AjaxResult.me().setDataObj(result);
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMessage("分页查询失败!"+e.getMessage());
        }
    }

    /**
     * 查询部门树
     */
    @RonghuaPermission(name = "查询部门树")
    @GetMapping("/tree")
    public AjaxResult tree(){
        try {
            List<Department> departments = departmentService.tree();
            return AjaxResult.me().setDataObj(departments);
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMessage("部门树查询失败!"+e.getMessage());
        }
    }
}
